
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Diagnostics;
using System.Security.Claims;
namespace SB2.Core;
public class RequestActionFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // 获取 HttpContext 和 HttpRequest 对象
        var httpContext = context.HttpContext;
        var httpRequest = httpContext.Request;
        // 获取操作人（必须授权访问才有值）"userId" 为你存储的 claims type，jwt 授权对应的是 payload 中存储的键名
        var userId = httpContext.User?.FindFirstValue("userId");
        var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

        // Console.WriteLine(Furion.JsonSerialization.JSON.Serialize(context.ActionArguments));
        // foreach (var metadata in actionDescriptor.EndpointMetadata)
        // {
        //     //判断是否需有 权限验证
        //     if (metadata.GetType() == typeof(PermissionCheckAttribute))
        //     {
        //         // 获取对应userId 的 权限 
        //         var permissionCheck = metadata as PermissionCheckAttribute;
        //         if (!permissionCheck.Check(new System.Collections.Generic.List<string>()))
        //         {
        //             // 无权操作
        //             return;
        //         }

        //     }
        // }

        // 请求时间
        var requestedTime = DateTimeOffset.Now;
        //============== 这里是执行方法之后获取数据 ====================
        var actionContext = await next();
        // 获取返回的结果
        var returnResult = actionContext.Result;
        // 判断是否请求成功，没有异常就是请求成功
        var isRequestSucceed = actionContext.Exception == null;
        // 获取调用堆栈信息，提供更加简单明了的调用和异常堆栈
        var stackTrace = EnhancedStackTrace.Current();
        // 其他操作，如写入日志
    }
}